#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Python数据类型详解示例

本程序详细介绍Python中的各种数据类型，包括：
1. 数字类型
2. 组合数据类型
3. 每种类型的定义方法和使用场景
"""

import random
import sys


def main():
    """主函数：展示Python中各种数据类型"""
    print("="*80)
    print("Python 数据类型详解".center(70))
    print("="*80)
    
    # 1. 数字类型
    print("\n1. 数字类型 (Numeric Types)")
    print("-"*50)
    
    # 1.1 整型 (int)
    print("\n1.1 整型 (int)")
    print("定义方法：直接赋值整数")
    
    # 不同进制的整数
    decimal_int = 42         # 十进制
    binary_int = 0b101010    # 二进制
    octal_int = 0o52         # 八进制
    hex_int = 0x2A           # 十六进制
    
    print(f"十进制整数: {decimal_int}, 类型: {type(decimal_int)}")
    print(f"二进制整数: {binary_int}, 类型: {type(binary_int)}")
    print(f"八进制整数: {octal_int}, 类型: {type(octal_int)}")
    print(f"十六进制整数: {hex_int}, 类型: {type(hex_int)}")
    print(f"Python整数大小不受限制: {sys.maxsize}")
    print("用途：计数、索引、序号、状态码等")
    
    # 1.2 浮点型 (float)
    print("\n1.2 浮点型 (float)")
    print("定义方法：包含小数点的数字或科学计数法")
    
    float1 = 3.14
    float2 = 1.6e-19  # 科学计数法
    
    print(f"普通浮点数: {float1}, 类型: {type(float1)}")
    print(f"科学计数法浮点数: {float2}, 类型: {type(float2)}")
    print("注意：浮点数有精度限制")
    print(f"例如：0.1 + 0.2 = {0.1 + 0.2}")
    print("用途：科学计算、金融计算（但注意精度问题）、需要小数精度的场景")
    
    # 1.3 复数型 (complex)
    print("\n1.3 复数型 (complex)")
    print("定义方法：使用j或J表示虚部")
    
    complex1 = 3 + 4j
    complex2 = complex(5, -6)
    
    print(f"复数: {complex1}, 类型: {type(complex1)}")
    print(f"使用complex()函数: {complex2}, 类型: {type(complex2)}")
    print(f"实部: {complex1.real}, 虚部: {complex1.imag}")
    print("用途：科学计算、信号处理、量子计算等高级数学运算")
    
    # 2. 组合数据类型
    print("\n\n2. 组合数据类型 (Composite Types)")
    print("-"*50)
    
    # 2.1 列表 (list) - 可变数组
    print("\n2.1 列表 (list) - 可变数组")
    print("定义方法：使用方括号 []")
    
    # 定义空列表
    empty_list = []
    # 定义包含元素的列表
    numbers = [1, 2, 3, 4, 5]
    # 混合类型列表
    mixed_list = [1, "two", 3.0, True]
    # 使用列表推导式
    squares = [x**2 for x in range(1, 6)]
    
    print(f"空列表: {empty_list}, 类型: {type(empty_list)}")
    print(f"数字列表: {numbers}, 类型: {type(numbers)}")
    print(f"混合类型列表: {mixed_list}, 类型: {type(mixed_list)}")
    print(f"列表推导式生成的平方列表: {squares}")
    
    # 列表的常见操作
    print("\n列表的常见操作:")
    numbers.append(6)  # 添加元素
    print(f"添加元素后: {numbers}")
    numbers.insert(0, 0)  # 插入元素
    print(f"插入元素后: {numbers}")
    numbers.remove(3)  # 删除元素
    print(f"删除元素后: {numbers}")
    print(f"访问列表元素: {numbers[2]}")
    print(f"列表切片: {numbers[1:4]}")
    
    print("用途：存储同类型或不同类型的多个数据，支持增删改查，适用于需要频繁修改的数据集合")
    
    # 2.2 元组 (tuple) - 不可变数组
    print("\n2.2 元组 (tuple) - 不可变数组")
    print("定义方法：使用圆括号 ()，单个元素需要加逗号")
    
    # 定义空元组
    empty_tuple = ()
    # 定义包含多个元素的元组
    person = ("Alice", 30, "Engineer")
    # 单个元素的元组（必须加逗号）
    single_element_tuple = (42,)
    # 不使用括号的元组（元组打包）
    coordinates = 10, 20
    
    print(f"空元组: {empty_tuple}, 类型: {type(empty_tuple)}")
    print(f"人员信息元组: {person}, 类型: {type(person)}")
    print(f"单元素元组: {single_element_tuple}, 类型: {type(single_element_tuple)}")
    print(f"无括号元组: {coordinates}, 类型: {type(coordinates)}")
    print(f"访问元组元素: {person[0]}")
    
    # 元组解包
    name, age, profession = person
    print(f"元组解包: 姓名={name}, 年龄={age}, 职业={profession}")
    
    print("用途：存储不可变的数据集合，常用于函数返回多个值，作为字典键，或保护数据不被修改")
    
    # 2.3 集合 (set) - 无序不重复元素集合
    print("\n2.3 集合 (set) - 无序不重复元素集合")
    print("定义方法：使用花括号 {} 或 set() 函数")
    
    # 定义空集合（不能直接用 {}，那是字典）
    empty_set = set()
    # 定义包含元素的集合
    unique_numbers = {1, 2, 3, 4, 5}
    # 从列表创建集合（去重）
    duplicates = [1, 2, 2, 3, 4, 4, 5]
    no_duplicates = set(duplicates)
    
    print(f"空集合: {empty_set}, 类型: {type(empty_set)}")
    print(f"数字集合: {unique_numbers}, 类型: {type(unique_numbers)}")
    print(f"去重后的集合: {no_duplicates}")
    
    # 集合的常见操作
    print("\n集合的常见操作:")
    s1 = {1, 2, 3, 4}
    s2 = {3, 4, 5, 6}
    print(f"并集: {s1 | s2}")
    print(f"交集: {s1 & s2}")
    print(f"差集: {s1 - s2}")
    print(f"对称差: {s1 ^ s2}")
    
    print("用途：去重、集合运算（并集、交集、差集）、快速成员检查")
    
    # 2.4 字典 (dict) - 键值对集合
    print("\n2.4 字典 (dict) - 键值对集合")
    print("定义方法：使用花括号 {} 和冒号 :")
    
    # 定义空字典
    empty_dict = {}
    # 定义包含元素的字典
    student = {"name": "Bob", "age": 22, "grade": "A"}
    # 使用字典推导式
    squares_dict = {x: x**2 for x in range(1, 6)}
    
    print(f"空字典: {empty_dict}, 类型: {type(empty_dict)}")
    print(f"学生信息字典: {student}, 类型: {type(student)}")
    print(f"字典推导式生成的平方字典: {squares_dict}")
    
    # 字典的常见操作
    print("\n字典的常见操作:")
    print(f"访问值: {student['name']}")
    student['major'] = "Computer Science"  # 添加键值对
    print(f"添加键值对后: {student}")
    student['age'] = 23  # 修改值
    print(f"修改值后: {student}")
    del student['grade']  # 删除键值对
    print(f"删除键值对后: {student}")
    print(f"获取所有键: {list(student.keys())}")
    print(f"获取所有值: {list(student.values())}")
    print(f"获取所有键值对: {list(student.items())}")
    
    print("用途：快速查找、数据关联、配置信息存储、缓存等需要键值映射的场景")
    
    # 3. 其他数据类型
    print("\n\n3. 其他重要数据类型")
    print("-"*50)
    
    # 3.1 字符串 (str)
    print("\n3.1 字符串 (str)")
    print("定义方法：使用单引号、双引号或三引号")
    
    single_quoted = 'Hello'
    double_quoted = "World"
    multi_line = """这是一个
多行字符串"""
    f_string = f"{single_quoted} {double_quoted}!"
    
    print(f"单引号字符串: {single_quoted}, 类型: {type(single_quoted)}")
    print(f"双引号字符串: {double_quoted}, 类型: {type(double_quoted)}")
    print(f"多行字符串: {multi_line}")
    print(f"f-string: {f_string}")
    
    print("用途：文本处理、数据展示、配置信息等")
    
    # 3.2 布尔型 (bool)
    print("\n3.2 布尔型 (bool)")
    print("定义方法：使用True或False关键字")
    
    is_active = True
    is_admin = False
    
    print(f"布尔值 True: {is_active}, 类型: {type(is_active)}")
    print(f"布尔值 False: {is_admin}, 类型: {type(is_admin)}")
    print(f"布尔运算结果: {5 > 3}, {10 == 10}")
    
    print("用途：条件判断、逻辑运算、状态标记等")
    
    # 4. 数据类型的实际应用示例
    print("\n\n4. 数据类型的实际应用示例")
    print("-"*50)
    
    # 随机生成学生信息并处理
    print("\n学生信息管理系统模拟:")
    
    # 生成随机学生数据
    students = []
    names = ["Alice", "Bob", "Charlie", "David", "Eva", "Frank", "Grace", "Henry"]
    courses = ["Math", "Physics", "Chemistry", "Biology", "Computer Science"]
    
    for i in range(5):
        student = {
            "id": i + 1,
            "name": random.choice(names),
            "age": random.randint(18, 25),
            "courses": random.sample(courses, random.randint(2, 4)),
            "grades": {course: random.randint(60, 100) for course in courses}
        }
        students.append(student)
    
    # 显示所有学生信息
    for student in students:
        print(f"\n学生ID: {student['id']}")
        print(f"姓名: {student['name']}")
        print(f"年龄: {student['age']}")
        print(f"选修课程: {', '.join(student['courses'])}")
        # 计算平均分
        enrolled_grades = [student['grades'][course] for course in student['courses']]
        avg_grade = sum(enrolled_grades) / len(enrolled_grades)
        print(f"平均成绩: {avg_grade:.2f}")
    
    print("\n" + "="*80)
    print("Python数据类型详解演示完成！".center(70))
    print("="*80)
    

if __name__ == "__main__":
    main()